package com.sy.controller;

import com.sy.constant.Scope;
import com.sy.dto.JsonResult;
import com.sy.entity.User;
import com.sy.service.UserService;
import com.sy.utils.HttpUtils;
import com.sy.utils.RandomUtils;
import com.sy.utils.RedisClient;
import com.sy.utils.SmsUtils;
import com.sy.vo.LoginParams;
import com.sy.vo.SendCodeParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;


import javax.servlet.http.HttpServletResponse;

import static com.sy.constant.BusinessConstant.*;

/**
 * Description:
 * date: 2021/1/13 14:37
 * 和用户操作相关的处理器
 * @author:
 * @since JDK 1.8
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisClient redisClient;
    @Autowired(required = false)
    private HttpServletResponse res;
    @Autowired
    private HttpUtils httpUtils;
    /**
     * 登录
     * @return
     */
    @RequestMapping(value = "/users",method = RequestMethod.POST)
    public JsonResult login(@RequestBody LoginParams loginParams) {
        System.out.println(loginParams);
        JsonResult result = userService.login(loginParams);
        //保存用户的登录状态-使用Redis来保存用户的登录状态(模拟Session的功能)
        //1.在客户端创建一个Token（令牌），这个Token相当于之前的SessionId
        //用于对客户端进行唯一的标识，将这个Token存在Cookie中
        //(1)生成Token
        String token = RandomUtils.getUuid();
        //(2)保存Token
        httpUtils.addCookie(COOKIE_TOKEN_NAME, token, SESSION_MAX_AGE);
        //2.将登录后的用户信息写入Redis中
        //Redis在保存用户信息的时候，以客户端中的Token来作为区分每个用户的依据
        User user = (User) result.getData();
        String key = REDIS_USER_PREFIX + token;
        redisClient.setObj(key, user);
        redisClient.expire(key, SESSION_MAX_AGE);
        res.setStatus(result.getCode());
        return result;
    }

    /**
     * 发送验证码
     * @param sendCodeParams 与发送验证码相关的参数
     * @return
     */
    @RequestMapping(value = "/codes",method = RequestMethod.POST)
    public JsonResult sendCode(@RequestBody SendCodeParams sendCodeParams) {
        String code = RandomUtils.getRandomString(6);
        System.out.println(code);
        //将验证码存入Session
        httpUtils.setAttribute(SESSION_CODE_NAME, code, Scope.SESSION);
        //获取前端提交的手机号
        String phone = sendCodeParams.getPhone();
        //发送验证码
        SmsUtils.sendMsg(phone, code);
        res.setStatus(200);
        return httpUtils.buildSuccess(200,code);
    }

    /**
     * 获取登录的用户信息
     * @return
     */
    @RequestMapping("/loginUser")
    public JsonResult getLoginUser() {
        //从Cookie中获取Token
        //(1)如果Token不存在，说明用户没有登录
        String token = httpUtils.getCookie(COOKIE_TOKEN_NAME);
        if (null == token) {
            return httpUtils.buildFailure(404,"用户未登录");
        }
        //(2)如果Token存在，使用user:+Token到Redis中查询有无对应的key
        String key = REDIS_USER_PREFIX + token;
        //(2-1)如果不存在，说明用户没有登录
        if (!redisClient.exists(key)) {
            return httpUtils.buildFailure(404,"用户未登录");
        }
        //(2-2)如果存在，则说明用户登录，返回当前用户的登录信息
        else {
            //反序列化得到Redis中的用户对象
            User user = redisClient.getObj(key);
            return httpUtils.buildSuccess(200,user);
        }
    }

    /**
     * 注销
     */
    @RequestMapping("logout")
    public JsonResult logout() {
        String token = httpUtils.getCookie(COOKIE_TOKEN_NAME);
        //删除Cookie中的Token
        httpUtils.deleteCookie(COOKIE_TOKEN_NAME);
        //删除Redis中与Token对应的key
        String key = REDIS_USER_PREFIX + token;
        redisClient.del(key);
        return httpUtils.buildSuccess(200);
    }

    /**
     * 获得导航页博客专家相关信息
     * @return
     */
    @GetMapping("/experts")
    public JsonResult getNavBlogExpertInfo(){
        JsonResult result = userService.getNavBlogExpertInfo();
        res.setStatus(result.getCode());
        return result;
    }
}
